#include <iostream>
#include <map>
#include <functional>

int minus(int a,int b)
{
    return a + b;
}

class Add
{
public:
    int operator()(int a,int b)
    {
        return a + b;
    }
};

int main()
{
    //[] : 捕获列表:获取上下文中的变量
    //值捕获:以右值形式捕获变量值
    //&:引用捕获
    //=:以值捕获所有变量
    //() : 函数参数列表
    //{} : 函数主体
    //自动推导返回值类型
    //本质就是仿函数
    // int b = 20;
    // int count = 10;
    // auto f = [=,&count](int a)
    // {
    //     count++;
    //     std::cout<<count<<" "<<a<<" "<<"lambda\n";
    //     return 20;
    // };
    // f(10);

    //函数对象 : 融合三种对函数的调用形式，形成统一格式
    Add a;
    //std::function<int(int,int)> f = a;
    // std::function<int(int,int)> f = minus;
    //std::function<int(int,int)> f = [](int a,int b){return a + b;};

    std::map<char,std::function<int(int,int)>> m;
    m['+'] = a;
    m['-'] = minus;
    m['*'] = [](int a,int b){return a * b;};
    m['/'] = [](int a,int b){return a / b;};



    //工厂模式
    //map替代swich  多分支 : 注册机
    std::cout<<m['+'](1,2)<<std::endl;
    return 0;
}